import 'package:intl/intl.dart';

class TimeUtils {
  TimeUtils._();

  // 年
  static final DateFormat yyyy = DateFormat("yyyy");

  // 年-月
  static final DateFormat yyyyMm = DateFormat("yyyy-MM");

  // 年-月-日
  static final DateFormat yyyyMmDd = DateFormat("yyyy-MM-dd");

  // 年-月-日 时
  static final DateFormat yyyyMmDdHh = DateFormat("yyyy-MM-dd HH");

  // 年-月-日 时:分
  static final DateFormat yyyyMmDdHhMm = DateFormat("yyyy-MM-dd HH:mm");

  // 年-月-日 时:分:秒
  static final DateFormat yyyyMmDdHhMmSs = DateFormat("yyyy-MM-dd HH:mm:ss");

  // 时:分
  static final DateFormat hhMm = DateFormat("HH:mm");

  // 时:分:秒
  static final DateFormat hhMmSs = DateFormat("HH:mm:ss");

  /// 时间戳转字符串
  ///
  /// [time] 时间戳
  /// [dateFormat] 格式化, 默认为[yyyyMmDdHhMmSs]
  static String getFormatFromTime(int time, {DateFormat? dateFormat}) {
    assert(time >= 0, "时间值不能为负数");
    if (time == 0) {
      return "";
    }
    return (dateFormat ?? yyyyMmDdHhMmSs).format(DateTime.fromMillisecondsSinceEpoch(time));
  }

  /// 字符串转时间戳
  ///
  /// [dateFormat] 字符串
  /// 转换失败返回-1，支持格式参考[DateTime.parse]
  static int getTimeFromFormat(String dateFormat) {
    if (dateFormat.isEmpty) {
      return 0;
    }
    try {
      DateTime dateTime = DateTime.parse(dateFormat);
      return dateTime.millisecondsSinceEpoch;
    } catch (error) {
      return -1;
    }
  }

  /// 时间差值
  static var timeInterval = 0;

  /// 服务器时间
  static int getRealTime() {
    return DateTime.now().millisecondsSinceEpoch - timeInterval;
  }

  /// 获取格式化日期
  static getFormatDate(int value, {String format = 'yyyy-MM-dd HH:mm:ss'}) {
    DateTime date = DateTime.fromMillisecondsSinceEpoch(value);
    // 使用 DateFormat 格式化 DateTime 对象
    String formattedDate = DateFormat(format).format(date);
    return formattedDate;
  }

  /// 获取时长展示字符串
  static String getPeakTimeStr(int value) {
    var hours = value ~/ 3600;
    value = value % 3600;
    var minutes = value ~/ 60;
    var seconds = value % 60;
    // LogUtils.v("getPeakTimeStr:$value, hours:$hours, minutes:$minutes, seconds:$seconds");
    return "${hours > 9 ? hours : "0$hours"}:${minutes > 9 ? minutes : "0$minutes"}:${seconds > 9 ? seconds : "0$seconds"}";
  }

  /// 获取间隔天数
  static int getIntervalDay(int time) {
    if (time == 0) {
      return 0;
    }
    DateTime realTime = DateTime.fromMillisecondsSinceEpoch(getRealTime());
    DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(time);
    Duration difference = realTime.difference(dateTime);
    return difference.inDays;
  }

  /// 是否同一周
  static bool isSameWeek(int time1, int time2) {
    var date1 = DateTime.fromMillisecondsSinceEpoch(time1);
    var date2 = DateTime.fromMillisecondsSinceEpoch(time2);
    // 获取每个日期所在的周的周一日期
    DateTime startOfWeek1 = getMonDay(date1);
    DateTime startOfWeek2 = getMonDay(date2);

    // 判断这两个周的第一天是否相同
    return isSameDay(startOfWeek1.millisecondsSinceEpoch, startOfWeek2.millisecondsSinceEpoch);
  }

  /// 获取日期周一的时间
  static DateTime getMonDay(DateTime data) {
    var weekday = data.weekday;
    if (weekday == 1) {
      return data;
    } else {
      return data.subtract(Duration(days: weekday - 1));
    }
  }

  /// 是否同一天
  static bool isSameDay(int time1, int time2) {
    var date1 = DateTime.fromMillisecondsSinceEpoch(time1);
    var date2 = DateTime.fromMillisecondsSinceEpoch(time2);

    // 判断这两个周的第一天是否相同
    return date1.year == date2.year &&
        date1.month == date2.month &&
        date1.day == date2.day;
  }
}
